#!/bin/bash

# =============================================================================
# 服务配置脚本
# =============================================================================

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'

log_info() { echo -e "${BLUE}[INFO]${NC} $1"; }
log_success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
log_warning() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }

PROJECT_DIR="/var/www/memebot"

log_info "开始服务配置..."

# 配置PM2开机自启
setup_pm2_startup() {
    log_info "配置PM2开机自启..."
    
    # 生成启动脚本
    STARTUP_CMD=$(pm2 startup | grep "sudo env" | head -1)
    
    if [ -n "$STARTUP_CMD" ]; then
        log_info "执行PM2启动命令..."
        eval $STARTUP_CMD
        log_success "PM2开机自启配置完成"
    else
        log_warning "无法自动配置PM2开机自启，请手动执行: pm2 startup"
    fi
}

# 启动应用服务
start_application() {
    log_info "启动应用服务..."
    cd $PROJECT_DIR
    
    # 停止可能存在的进程
    pm2 delete memebot-trading 2>/dev/null || true
    
    # 启动应用
    pm2 start ecosystem.config.js
    
    # 保存PM2配置
    pm2 save
    
    # 等待应用启动
    sleep 10
    
    # 检查应用状态
    if pm2 describe memebot-trading > /dev/null 2>&1; then
        log_success "应用启动成功"
        pm2 status
    else
        log_error "应用启动失败"
        pm2 logs memebot-trading --lines 20
        exit 1
    fi
}

# 创建systemd服务文件（备用方案）
create_systemd_service() {
    log_info "创建systemd服务文件..."
    
    sudo tee /etc/systemd/system/memebot.service > /dev/null << EOF
[Unit]
Description=MemeBot Trading System
After=network.target postgresql.service
Wants=postgresql.service

[Service]
Type=simple
User=$USER
WorkingDirectory=$PROJECT_DIR
Environment=NODE_ENV=production
Environment=PORT=3000
ExecStart=/usr/bin/node lib/price-server.js
Restart=always
RestartSec=10
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=memebot

[Install]
WantedBy=multi-user.target
EOF
    
    # 重新加载systemd
    sudo systemctl daemon-reload
    
    log_success "systemd服务文件创建完成"
    log_info "可以使用以下命令管理服务:"
    echo "  sudo systemctl start memebot"
    echo "  sudo systemctl stop memebot"
    echo "  sudo systemctl enable memebot"
    echo "  sudo systemctl status memebot"
}

# 配置日志轮转
setup_log_rotation() {
    log_info "配置应用日志轮转..."
    
    sudo tee /etc/logrotate.d/memebot > /dev/null << EOF
/var/log/memebot/*.log {
    daily
    missingok
    rotate 30
    compress
    delaycompress
    notifempty
    create 644 $USER $USER
    postrotate
        pm2 reloadLogs
    endscript
}
EOF
    
    log_success "日志轮转配置完成"
}

# 创建健康检查脚本
create_health_check() {
    log_info "创建健康检查脚本..."
    
    cat > /home/$USER/health_check.sh << 'EOF'
#!/bin/bash

# 健康检查脚本
PROJECT_DIR="/var/www/memebot"
LOG_FILE="/var/log/memebot/health_check.log"

# 检查应用进程
check_app_process() {
    if ! pm2 describe memebot-trading > /dev/null 2>&1; then
        echo "$(date): 应用进程未运行，正在重启..." >> $LOG_FILE
        cd $PROJECT_DIR
        pm2 restart memebot-trading
        return 1
    fi
    return 0
}

# 检查HTTP响应
check_http_response() {
    if ! curl -f -s http://localhost:3000/health > /dev/null 2>&1; then
        echo "$(date): HTTP健康检查失败" >> $LOG_FILE
        return 1
    fi
    return 0
}

# 检查数据库连接
check_database() {
    if ! pg_isready -h localhost -p 5432 > /dev/null 2>&1; then
        echo "$(date): 数据库连接失败" >> $LOG_FILE
        return 1
    fi
    return 0
}

# 检查磁盘空间
check_disk_space() {
    USAGE=$(df / | awk 'NR==2 {print $5}' | sed 's/%//')
    if [ $USAGE -gt 85 ]; then
        echo "$(date): 磁盘使用率过高: ${USAGE}%" >> $LOG_FILE
        return 1
    fi
    return 0
}

# 检查内存使用
check_memory() {
    MEM_USAGE=$(free | awk 'NR==2{printf "%.0f", $3*100/$2}')
    if [ $MEM_USAGE -gt 90 ]; then
        echo "$(date): 内存使用率过高: ${MEM_USAGE}%" >> $LOG_FILE
        return 1
    fi
    return 0
}

# 执行所有检查
FAILED=0
check_app_process || FAILED=1
check_http_response || FAILED=1
check_database || FAILED=1
check_disk_space || FAILED=1
check_memory || FAILED=1

if [ $FAILED -eq 0 ]; then
    echo "$(date): 所有健康检查通过" >> $LOG_FILE
fi

exit $FAILED
EOF
    
    chmod +x /home/$USER/health_check.sh
    log_success "健康检查脚本创建完成"
}

# 配置定时任务
setup_cron_jobs() {
    log_info "配置定时任务..."
    
    # 创建临时crontab文件
    TEMP_CRON=$(mktemp)
    
    # 获取现有crontab（如果存在）
    crontab -l 2>/dev/null > $TEMP_CRON || true
    
    # 添加新的定时任务
    cat >> $TEMP_CRON << EOF

# MemeBot 健康检查 (每5分钟)
*/5 * * * * /home/$USER/health_check.sh

# PM2 日志重载 (每天凌晨1点)
0 1 * * * pm2 reloadLogs

# 清理旧日志 (每周日凌晨2点)
0 2 * * 0 find /var/log/memebot -name "*.log" -mtime +30 -delete
EOF
    
    # 安装新的crontab
    crontab $TEMP_CRON
    rm $TEMP_CRON
    
    log_success "定时任务配置完成"
    log_info "已配置的定时任务:"
    crontab -l | grep -E "(health_check|pm2|memebot)" || true
}

# 创建管理脚本
create_management_scripts() {
    log_info "创建管理脚本..."
    
    # 启动脚本
    cat > /home/$USER/start_memebot.sh << EOF
#!/bin/bash
cd $PROJECT_DIR
pm2 start ecosystem.config.js
pm2 save
echo "MemeBot 启动完成"
EOF
    
    # 停止脚本
    cat > /home/$USER/stop_memebot.sh << EOF
#!/bin/bash
pm2 stop memebot-trading
echo "MemeBot 已停止"
EOF
    
    # 重启脚本
    cat > /home/$USER/restart_memebot.sh << EOF
#!/bin/bash
cd $PROJECT_DIR
pm2 restart memebot-trading
echo "MemeBot 重启完成"
EOF
    
    # 查看日志脚本
    cat > /home/$USER/logs_memebot.sh << EOF
#!/bin/bash
pm2 logs memebot-trading --lines 100
EOF
    
    # 状态检查脚本
    cat > /home/$USER/status_memebot.sh << EOF
#!/bin/bash
echo "=== PM2 状态 ==="
pm2 status

echo -e "\n=== 应用日志 (最近10行) ==="
pm2 logs memebot-trading --lines 10

echo -e "\n=== 系统资源 ==="
echo "CPU使用率: \$(top -bn1 | grep "Cpu(s)" | awk '{print \$2}' | cut -d'%' -f1)%"
echo "内存使用率: \$(free | awk 'NR==2{printf "%.1f%%", \$3*100/\$2}')"
echo "磁盘使用率: \$(df -h / | awk 'NR==2{print \$5}')"

echo -e "\n=== 网络连接 ==="
netstat -tulpn | grep :3000 || echo "端口3000未监听"
EOF
    
    # 设置执行权限
    chmod +x /home/$USER/{start,stop,restart,logs,status}_memebot.sh
    
    log_success "管理脚本创建完成"
    log_info "可用的管理脚本:"
    echo "  ~/start_memebot.sh   - 启动应用"
    echo "  ~/stop_memebot.sh    - 停止应用"
    echo "  ~/restart_memebot.sh - 重启应用"
    echo "  ~/logs_memebot.sh    - 查看日志"
    echo "  ~/status_memebot.sh  - 查看状态"
}

# 主函数
main() {
    setup_pm2_startup
    start_application
    create_systemd_service
    setup_log_rotation
    create_health_check
    setup_cron_jobs
    create_management_scripts
    
    log_success "服务配置完成！"
    log_info "应用已启动，可以通过以下方式管理:"
    echo "  pm2 status                - 查看PM2状态"
    echo "  pm2 logs memebot-trading  - 查看应用日志"
    echo "  pm2 restart memebot-trading - 重启应用"
    echo "  ~/status_memebot.sh       - 查看详细状态"
}

# 运行主函数
main "$@"
